home *** CD-ROM | disk | FTP | other *** search
-
- Immortal Descendants CrackMe 4.0
- Tutorial version 1.0 (4 avril 99) by Lucifer48
- |
- \---> O∙ comment occuper son Week-End de PΓques...
-
- Outils utilisΘs: Soft-Ice v3.24
-
- ===============
- 1. INTRODUCTION
- ===============
-
- On s'introduit dans le code avec un bpx hmemcpy, quelques pressions de F12/F10 et:
-
- XXXX:00402260 PUSH EBX ;handle de la fenΩtre du crackme
- XXXX:00402261 PUSH 0040BE28 ;serial
- XXXX:00402266 PUSH 0040BDE0 ;group
- XXXX:0040226B PUSH 0040BF30 ;name
- XXXX:00402270 CALL 00401CF0 ;Tout est lα dedans
- XXXX:00402275 ADD ESP,10 ;dΘ-pop les 4 push
- XXXX:00402278 CMP WORD PTR [0040BE20],28 ;Si on a FFFF, c'est que notre serial n'est pas le bon
- XXXX:00402280 JNZ 004022A0
-
- On va donc explorer, ce call...
-
- ==============================
- 2. JUSTE UN INSTANT DE PLUS...
- ==============================
-
- Pour enlever la vΘrification du nombre d'essai, trois essais pour rΘsoudre ce crackme, c'est
- un peu juste. C'est assez simple:
-
- XXXX:004022A0 MOV AX,[0040A074] ;nombre d'essai dΘjα effectuΘs
- XXXX:004022A6 INC AX
- XXXX:004022A8 MOV [0040A074],AX ;sauvegarde
- XXXX:004022AE CMP AX,0003
- XXXX:004022B2 JNZ 004022E6 ;3 essais = Boutton "Validate" dΘsactivΘ
-
- On remplace le INC AX par deux NOP et c'est bon.
- Pour ceux qui aurait l'idΘe de remplacer AX pour une valeur supΘrieure α 3, TORN@DO a tout
- prΘvu; une MessageBox apparaεt:
-
- "You're using a window editing tool like THE CUSTOMISER
- You have had 3 chances for entering the right code!
- Do you think that's fair?"
-
- ==================
- 3. LET'S CMP [1/5]
- ==================
-
- On entre donc dans le call 00401CF0
-
- ...
- XXXX:00401CF9 CALL 004019F0 ;courte procedure inutile
- XXXX:00401CFE ADD ESP,04 ;instruction prΘfΘrΘe des compilateurs...
- XXXX:00401D01 PUSH EBX
- XXXX:00401D02 CALL 00401720 ;α explorer absolument!
- XXXX:00401D07 ADD ESP,04
- XXXX:00401D0A CMP EAX,01
- XXXX:00401D0D JZ 00401D1D ;on doit avoir EAX=1 pour continuer
- XXXX:00401D0F MOV WORD PTR [0040BE20],FFFF ;mauvais serial, si on passe par ici
- ...
- XXXX:00401D1C RET ;retour
-
- On doit sortir du CALL 00401720 avec EAX=1:
-
- XXXX:00401722 MOV ESI,[ESP+0C] ;ESI pointe vers notre serial
- XXXX:00401726 PUSH EDI
- XXXX:00401727 MOV AL,[ESI+01] ;lecture du 2Φme caractΦre
- XXXX:0040172A MOV CL,[ESI+02] ;lecture du 3Φme caractΦre
- XXXX:0040172D XOR AL,49
- XXXX:0040172F XOR CL,44
- XXXX:00401732 MOVSX EAX,AL
- XXXX:00401735 MOV DL,[ESI+03] ;lecture du 4Φme caractΦre
- XXXX:00401738 MOV BL,[ESI] :lecture du 1er caractΦre
- XXXX:0040173A XOR DL,39
- XXXX:0040173D XOR BL,54
- XXXX:00401740 MOVSX ECX,CL
- XXXX:00401743 MOVSX EDI,DL
- XXXX:00401746 MOV DL,[ESI+04] ;lecture du 5Φme caractΦre
- XXXX;00401749 XOR DL,39
-
- AprΦs il s'en suit cinq comparaisons, s'il elles sont vΘrifiΘes alors EAX=1 sinom EAX=0.
- CMP BL,1D ( 1D XOR 54 = 49 [I] )
- CMP EAX,0D ( 0D XOR 49 = 44 [D] )
- CMP ECX,07 ( 07 XOR 44 = 43 [C] )
- CMP EDI,0D ( 0D XOR 39 = 34 [4] )
- CMP EDX,09 ( 09 XOR 39 = 30 [0] )
-
- fin du CALL 00401720, le dΘbut du serial est donc IDC40.
- On poursuit en 00401D1D.
-
- ================================
- 4. LET'S CMP [2/5] : XOR MON AMI
- ================================
-
- XXXX:00401D2D CALL 00401A20 ;100% inutile
- XXXX:00401D32 ADD ESP,10
- XXXX:00401D35 PUSH EBX
- XXXX:00401D36 CALL 00401790
- XXXX:00401D3B ADD ESP,10
- XXXX:00401D3E CMP EAX,01
- XXXX:00401D41 JZ 00401D51 ;comme tout α l'heure...
- XXXX:00401D43 MOV WORD PTR [0040BE20];FFFF ;mauvais serial...
- ...
- XXXX:00401D50 RET ;retour
-
- Notre mission: sortir du call 00401790 avec EAX=01.
-
- XXXX:00401790 MOV EAX,[ESP+04] ;EAX pointe vers notre serial
- XXXX:00401794 PUSH EBX
- XXXX:00401795 PUSH ESI
- XXXX:00401796 MOV CL,[EAX+07] ;lecture du 8Φme caractΦre
- XXXX:00401799 XOR CL,52
- XXXX:0040179C MOV DL,[EAX+08] :lecture du 9Φme caractΦre
- XXXX:0040179F XOR DL,45
- XXXX:004017A2 MOV BL,[EAX+09] ;lecture du 10Φme caractΦre
- XXXX:004017A5 XOR BL,53
- XXXX:004017A8 MOV AL,[EAX+06] :lecture du 7Φme caractΦre
- XXXX:004017AB MOVSX ECX,CL
- XXXX:004017AE MOVSX EDX,DL
- XXXX:004017B1 MOVSX ESI,BL
- XXXX:004017B4 XOR AL,54
-
- AprΦs, encore quelques comparaisons:
- CMP AL,11 ( 11 XOR 54 = 45 [E] )
- CMP ECX,06 ( 06 XOR 52 = 54 [T] )
- CMP EDX,07 ( 07 XOR 45 = 42 [B] )
- CMP ESI,1F ( 1F XOR 53 = 4C [L] )
-
- fin du call 00401790, avec EAX=1
- Notre serial ressemnble a un truc du genre IDC40*ETBL***...
- "*" dΘsigne (pour l'instant) un caractΦre quelconque.
- On continue en XXXX:00401D51.
-
- ============================
- 5. LET'S CMP [3/5] : LA DATE
- ============================
-
- XXXX:00401D51 PUSH EBX
- XXXX:00401D52 CALL 004017E0 ;α explorer
- XXXX:00401D57 ADD ESP,04
- XXXX:00401D5A CMP EAX,01
- XXXX:00401D5D JZ 00401D6D
- XXXX:00401D5F MOV DWORD PTR [0040BE20],FFFF
- ...
- XXXX:00401D6C RET :retour
-
- On doit (encore) sortir avec EAX=1 du CALL 004017E0.
-
- ...
- XXXX:00401851 PUSH EAX ;pointe vers les 4 derniers caractΦres du mon serial
- XXXX:00401852 CALL 00403480 ;conversion hΘxadΘcimale rΘsultat dans EAX.
- XXXX:00401857 ADD ESP,04
- XXXX:0040185A MOV ESI,EAX ;sauvegarde du rΘsultat de la conversion
- XXXX:0040185C CALL 004016A0 ;α explorer! (on s'amuse avec l'horloge)
- XXXX:00401861 SUB EAX,ESI
- XXXX:00401863 POP EDI
- XXXX:00401864 POP ESI
- XXXX:00401865 CMP EAX,01
- XXXX:00401868 SBB EAX,EAX ;il faut que CF=1
- XXXX:0040186A ADD ESP,04
- XXXX:0040186D NEG EAX ;NEG FFFFFFFF = 00000001
- XXXX:0040186F RET
-
- Explorons le call 004016A0:
-
- XXXX:004016A8 PUSH EAX
- XXXX:004016A9 CALL [KERNEL32!GetLocalTime] ;dΘcidΘment c'est une manie chez TORN@DO...
- XXXX:004016AF XOR EDX,EDX
- XXXX:004016B1 XOR EAX,EAX
- XXXX:004016B3 MOV DX,[ESP+06] ;mois
- XXXX:004016B8 XOR ECX,ECX
- XXXX:004016BA MOV AX,[ESP+0A] ;jour du mois
- XXXX:004016BF IMUL EDX,EAX
- XXXX:004016C2 MOV CX,[ESP+0E] ;minute
- XXXX:004016C7 MOV EAX,[ESP+0C] ;heure
- XXXX:004016CB AND EAX,0000FFFF
- XXXX:004016D0 IMUL EAX,ECX
- XXXX:004016D3 MOVSX ECX,BYTE PTR [0040BF60] ;1Φre lettre de (*)
- XXXX:004016DA ADD EDX,EAX
- XXXX:004016DC MOV EAX,[ESP+04] ;annΘe
- XXXX:004016E0 SUB EDX,ECX
- XXXX:004016E2 AND EAX,0000FFFF
- XXXX:004016E7 LEA ESI,[EAX+EDX]
- XXXX:004016EA PUSH ESI ;sauvegarde du prΘcieux rΘsultat
- XXXX:004016EB CALL 00401290 ;Soft Ice (pour win95/98) installΘ ?
- XXXX:004016F0 ADD ESP,04
- XXXX:004016F3 TEST EAX,EAX
- XXXX:004016F5 JZ 004016FD
- XXXX:004016F7 ADD ESI,00000143 ;si "si95" est installΘ ESI=ESI+143
- XXXX:004016FD PUSH ESI
- XXXX:004016FE CALL 004012D0 ;Soft Ice (pour winNT) installΘ ?
- XXXX:00401703 ADD ESP,04
- XXXX:00401706 TEST EAX,EAX
- XXXX:00401708 JZ 00401710
- XXXX:0040170A ADD ESI,00000271 ;si "siNT" est installΘ ESI=ESI+143
- XXXX:00401710 MOV EAX,ESI
- XXXX:00401712 POP ESI
- XXXX:00401713 ADD ESP,10
- XXXX:00401716 RET ;retour
-
- (*)
- [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
- "RegisteredOwner"="LuCiFeR48"
-
-
- Ainsi nos 4 derniers caractΦres de notre serial correspond uniquement α l'encryptage de la
- date et savoir si Soft Ice est installΘ.
- Il y a un nouveau serial chaque minute!
-
- On continue donc en XXXX:00401D6D
-
- ======================================================
- 6. LET'S CMP [4/5] : LA DATE D'INSTALLATION DE WINDOWS
- ======================================================
-
- XXXX:00401D71 CALL 00401B70 ;inutile
- XXXX:00401D76 ADD ESP,10
- XXXX:00401D79 MOV EAX,[0040C380]
- XXXX:00401D7E PUSH EAX
- XXXX:00401D7F PUSH EBX
- XXXX:00401D80 CALL 00401870 ;α explorer
- XXXX:00401D85 ADD ESP,08
- XXXX:00401D88 CMP EAX,01
- XXXX:00401D8B JZ 00401D9B ;encore une fois EAX doit valoir 1
- XXXX:00401D8D MOV WORD PTR [0040BE20],FFFF
- ...
- XXXX:00401D9A RET ;retour (mauvais cracker!)
-
- Explorons le call 00401870:
-
- (**) copie le serial α partir du 6Φme caractΦre au 12Φme (inclus) soit 7 chiffres.
- ...
- XXXX:004018BB LEA EAX,[ESP+10] ;pointe vers notre serial un peu dΘcoupΘ! (**)
- ... ;qui est ensuite converti en hexa
- XXXX:004018EE CALL 00403559 ;gΘnΦre un nombre hΘxa
- XXXX:004018F3 SUB EAX,ESI ;on doit avoir EAX=ESI pour que τa marche
- XXXX:004018F5 POP EBP
- XXXX:004018F6 POP EDI
- XXXX:004018F7 CMP EAX,01
- XXXX:004018FA SBB EAX,EAX
- XXXX:004018FC POP ESI
- XXXX:004018FD NEG EAX
- XXXX:004018FF POP EBX
- XXXX:00401900 ADD ESP,64
- XXXX:00401803 RET ;fin du call 00401870
-
- Un petit mot sur le call 00403559
- ...
- XXXX:004018CA MOV EAX,[0040BEFC] ;(#)
- XXXX:004018CF MOV [ESP+10],EAX
- XXXX:004018D3 MOV DWORD PTR [ESP+14],00000000
- XXXX:004018DB FILD QWORD PTR [ESP+10] ;
- XXXX:004018E1 CALL 00403559 ;
- XXXX:004018E6 FMUL REAL8 PTR [00409020] ; Je comprends pas ces lignes
- XXXX:004018EC FSUBP ST(1),ST ;
- XXXX:004018EE CALL 0040264C ;
- XXXX:004018F3 SUB EAX,ESI ;soustrait le rΘsultat avec notre conversion
- ...
- RET
-
- (#) d'ou vient ce nombre. Au dΘpart, τa vient des quatres octets lus en
- [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
- FirstInstallDateTime
- LΘgΦre modification via:
- XXXX:00401E70 MOV EBP,[USER32!wsprintfA]
- XXXX:00401E76 PUSH EAX ;les 4 octets de "FirstInstallDateTime"
- XXXX:00401E77 PUSH 0040A6C8
- XXXX:00401E7C PUSH 0040BF90 ;emplacement du rΘsultat
- XXXX:00401E81 CALL EBP
-
- Il faut que ce qui sort du call 00403559, soit votre valeur converti en dΘcimal prΘsent dans votre
- serial.
-
- Petit rΘcapitulatif:
- Exemple, pour moi: IDC40-ETBL22226617393-xxxx
- ----- ---- ------- ----
- LET'S CMP [1/5] ---- ------- ----
- partie: [2/5] ------- ----
- [4/5] ----
- [3/5]
-
- -: caractΦre quelconque.
- xxxx: α remplacer par le rΘsultat de l'encodage de la date (change chaque minute)
- mettre un BPX 00401865 et taper R EAX=0, et zou...
-
- et on continue en XXXX:00401D9B
-
- =========================================
- 7. LET'S CMP [5/5] : Encrytion Name+Group
- =========================================
-
- XXXX:00401D9F CALL 00401C30 ;inutile
- XXXX:00401DA4 ADD ESP,10
- XXXX:00401DA7 PUSH EBX
- XXXX:00401DA8 CALL 00401910 ;α explorer
- XXXX:00401DAD ADD ESP,04
- XXXX:00401DB0 CMP EAX,01
- XXXX:00401DB3 JZ 00401DC3 ;youpiiii! le cracke est fini!
- XXXX:00401DB5 MOV WORD PTR [0040BE20],FFFF
- ...
- XXXX:00401DC2 RET
-
- En XXXX:00401DC3, on est arrivΘ α la fin du crackme.
- Mais avant...il y le call 00401910 a explorer...
-
- ...
- XXXX:00401972 LEA EDX,[ESP+08] ;pointe vers une partie de mon serial (***)
- XXXX:00401976 PUSH EAX
- XXXX:00401977 CALL 00403480 ;conversion hexa (rΘsultat dans EAX)
- XXXX:0040197C ADD ESP,04 ;depop l'argument
- XXXX:0040197F MOV EDI,EAX ;sauvegarde du prΘcieux rΘsultat en EDI
- XXXX:00401981 CALL 00401590 ;sort un nombre hΘxa en EAX (petite addition)
- XXXX:00401986 MOV ESI,EAX
- XXXX:00401988 CALL 00401540 ;sort un nombre hΘxa en EAX (manip du "RegisteredOwner")
- XXXX:0040198D XOR ESI,EAX
- XXXX:0040198F PUSH 0040BDE0 ;group
- XXXX:00401994 PUSH 0040BF30 ;nom
- XXXX:00401999 CALL 004015E0
- XXXX:0040199E ADD ESP,08
- XXXX:004019A1 ADD EAX,ESI
- juste aprΦs:
- EAX=EAX*DB (on multiplie EAX par 219)
- ECX=4*ECX
- ECX=ECX-EAX
- ECX=64*ECX
- ECX=ECX-EAX
- ECX=2*ECX
- XXXX:004019B8 MOV [ESP+08],ECX
-
- (***) Forme dΘfinitive du serial:
- IDC40-ETBL-24654564564-6617393-xxxx
- -----------
- LET'S CMP [5/5]
- En 00401972, EDX va pointer vers 24654564564.
-
- | A propos du call 00401540, sa fonction est simple, il additionne tout les caractΦres du
- | "RegisteredOwner" (sauf le dernier).
- | Exmple pour moi:
- | ------IDCRKME40!.data+1F60-----------------------------------------------------
- | XXXX:0040BF60 4C 75 43 69 46 65 52 34 38 00 00 00 00 00 00 00 LuCiFeR48......
- |
- | 4C+75+43+69+46+65+52+34 = 29E = rΘsultat de EAX
-
- | A propos encore du call 00401590, sa fonction est encore plus simple, chaque numΘro du caractΦre
- | du "RegisteredOwner" (sauf le dernier) est multipliΘ par 2 et additionnΘ ensuite avec les autres.
- | Exemple: 1*2 + 2*2 + 3*2 + 4*2 + 5*2 + 6*2 + 7*2 + 8*2 = (1+2+3+4+5+6+7+8)*2 = 24*2 = 48
- | Soit plus symboliquement: si n est la longueur de la chaine du "RegisteredOwner"
- | On obtient la formule: (n-1)*n
- | Taille de "LuCiFeR48" = 9 et donc 9*8=48
- | Remarque (quasi Θvidente): tous les calculs sont en hΘxa.
-
- Quelques mots sur le call 004015E0,
- PremiΦre encryption du nom; chaque caractΦre (sauf le dernier) est multipliΘ par A29, et on
- additionne tout τa. On ajoute ensuite les valeurs ascii qui composent le group (sauf le dernier)
- Cette valeur est en ensuite multipliΘ par B (=11)
-
- [...]
-
- ...
- XXXX:004019C4 FILD QWORD PTR [ESP+08] ;
- XXXX:004019C8 FLD ST(0) ;
- XXXX:004019CA FSIN ; Je comprends pas ces lignes
- XXXX:004019CC FMUL REAL8 PTR [00409028] ;
- XXXX:004019D2 FSUBP ST(1),ST ;
- XXXX:004019D4 CALL 0040264C ;
- XXXX:004019D9 SUB EAX,EDI ;soustrait le rΘsultat avec notre conversion
- ...
- XXXX:004019DD CMP EAX,01 ;EAX=00 = bon serial!
- XXXX:004019E0 SBB EAX,EAX
- XXXX:004019E2 ADD ESP,64
- XXXX:004019E5 NEG EAX
- XXXX:004019E7 RET
-
-
- =====================================
- 8. AU FINAL : MON SERIAL SUR MESURE !
- =====================================
-
- Name: Lucifer48
- Group: None
- Serial: IDC40-ETBL-605573733-6617393-xxxx
-
- xxxx: remplacer par la date encrytΘe (partie 5. LET'S CMP [3/5] : LA DATE)
-
- /* FirstInstallDateTime: E1 B1 39 25
- RegisteredOwner: LuCiFeR48
- */
-
-